#!/usr/bin/env bash
# 这个文件中的函数可能部分来源于dylanaraps的pure-bash-bible项目。其中一些可能已经有所修改，详细请参考其原项目（地址： https://github.com/dylanaraps/pure-bash-bible）。

# 去掉字符串前后空格
trim_string() {
    # 用法：trim_string "string"
    : "${1#"${1%%[![:space:]]*}"}"
    : "${_%"${_##*[![:space:]]}"}"
    printf '%s\n' "$_"
}

# 去掉多余的空格，如果中间有多个连续空格，用一个空格替换
trim_all() {
    # 用法：trim_all "string"
    set -f
    set -- $*
    printf '%s\n' "$(trim_string "$*")"
    set +f
}

# 正则匹配一个字符串
regex() {
    # 用法：regex "string" "regex"
    [[ $1 =~ $2 ]] && printf '%s\n' "${BASH_REMATCH[1]}"
}
# 正则匹配并删除所有匹配的实例
strip_all() {
    # 用法：strip_all "string" "pattern"
    printf '%s\n' "${1//$2}"
}
# 正则匹配并删除第一次匹配的实例
strip() {
    # 用法：strip "string" "pattern"
    printf '%s\n' "${1/$2}"
}
# 在字符串开头匹配正则并删除
lstrip() {
    # 用法：lstrip "string" "pattern"
    printf '%s\n' "${1##$2}"
}
# 在字符串末尾匹配正则并删除
rstrip() {
    # 用法：rstrip "string" "pattern"
    printf '%s\n' "${1%%$2}"
}

# 替换所有匹配字符串
replace_all()
{
    # 用法：replace_all "string" "pattern" “replace”
    printf '%s\n' "${1//$2/$3}"
}
# 替换第一个匹配字符串
replace_first()
{
    # 用法：replace_all "string" "pattern" “replace”
    printf '%s\n' "${1/$2/$3}"
}

# 分割字符串
split() {
   # 用法：split "string" "delimiter"
   IFS=$'\n' read -d "" -ra arr <<< "${1//$2/$'\n'}"
   printf '%s\n' "${arr[@]}"
}

# 字符串转小写
lower() {
    # 用法：lower "string"
    printf '%s\n' "${1,,}"
}

# 字符串转大写
upper() {
    # 用法：upper "string"
    printf '%s\n' "${1^^}"
}

# 反转字符串大小写
reverse_case() {
    # 用法：reverse_case "string"
    printf '%s\n' "${1~~}"
}

# 删除字符串中的引号
trim_quotes() {
    # 用法：trim_quotes "string"
    : "${1//\'}"
    printf '%s\n' "${_//\"}"
}

# 百分号编码字符串
urlencode() {
    # 用法：urlencode "string"
    local LC_ALL=C
    for (( i = 0; i < ${#1}; i++ )); do
        : "${1:i:1}"
        case "$_" in
            [a-zA-Z0-9.~_-])
                printf '%s' "$_"
            ;;

            *)
                printf '%%%02X' "'$_"
            ;;
        esac
    done
    printf '\n'
}
# 解码用百分比编码的字符串
urldecode() {
    # 用法：urldecode "string"
    : "${1//+/ }"
    printf '%b\n' "${_//%/\\x}"
}